package com.zenithmind.common.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 安全配置属性
 * 统一管理安全相关的配置
 */
@Data
@Component
@ConfigurationProperties(prefix = "zenithmind.security")
public class SecurityProperties {
    
    /**
     * JWT配置
     */
    private Jwt jwt = new Jwt();
    
    /**
     * 动态安全配置
     */
    private Dynamic dynamic = new Dynamic();
    
    /**
     * 密码策略配置
     */
    private Password password = new Password();
    
    /**
     * 会话配置
     */
    private Session session = new Session();
    
    @Data
    public static class Jwt {
        /**
         * JWT密钥
         */
        private String secret = "default-jwt-secret-change-in-production";
        
        /**
         * JWT过期时间（秒）
         */
        private long expiration = 86400; // 24小时
        
        /**
         * 刷新令牌过期时间（秒）
         */
        private long refreshExpiration = 604800; // 7天
        
        /**
         * 发行者
         */
        private String issuer = "zenithmind";
        
        /**
         * 受众
         */
        private String audience = "zenithmind-users";
    }
    
    @Data
    public static class Dynamic {
        /**
         * 是否启用动态安全配置
         */
        private boolean enabled = true;
        
        /**
         * 配置刷新间隔（秒）
         */
        private long refreshInterval = 300; // 5分钟
        
        /**
         * 是否启用IP白名单
         */
        private boolean ipWhitelistEnabled = false;
        
        /**
         * 是否启用请求频率限制
         */
        private boolean rateLimitEnabled = true;
    }
    
    @Data
    public static class Password {
        /**
         * 最小密码长度
         */
        private int minLength = 8;
        
        /**
         * 最大密码长度
         */
        private int maxLength = 128;
        
        /**
         * 是否要求包含数字
         */
        private boolean requireDigit = true;
        
        /**
         * 是否要求包含小写字母
         */
        private boolean requireLowercase = true;
        
        /**
         * 是否要求包含大写字母
         */
        private boolean requireUppercase = false;
        
        /**
         * 是否要求包含特殊字符
         */
        private boolean requireSpecialChar = false;
        
        /**
         * 密码历史记录数量（防止重复使用）
         */
        private int historyCount = 5;
        
        /**
         * 密码过期天数（0表示不过期）
         */
        private int expirationDays = 0;
    }
    
    @Data
    public static class Session {
        /**
         * 会话超时时间（秒）
         */
        private long timeout = 1800; // 30分钟
        
        /**
         * 最大并发会话数
         */
        private int maxConcurrentSessions = 1;
        
        /**
         * 是否阻止新会话创建（当达到最大并发数时）
         */
        private boolean preventNewSession = false;
        
        /**
         * 会话固化保护
         */
        private boolean sessionFixationProtection = true;
        
        /**
         * 记住我功能
         */
        private RememberMe rememberMe = new RememberMe();
        
        @Data
        public static class RememberMe {
            /**
             * 是否启用记住我功能
             */
            private boolean enabled = true;
            
            /**
             * 记住我令牌有效期（秒）
             */
            private long tokenValiditySeconds = 1209600; // 14天
            
            /**
             * 记住我参数名
             */
            private String parameter = "remember-me";
            
            /**
             * 记住我密钥
             */
            private String key = "zenithmind-remember-me-key";
        }
    }
}
